﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Data.Entity.Infrastructure;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Diagnostics;
using System.Data.Entity.Validation;
using System.Data.Objects;

namespace WF_Office_Verwaltung
{
    public partial class frm_Kundenformular : Form
    {
        helfer_klasse aHelferKlasse = new helfer_klasse();
        nachrichten_klasse aNachrichtenKlasse = new nachrichten_klasse();
        dbCon_klasse aDbconKlasse = new dbCon_klasse();
        string sBemerkung = "Bemerkungen";

        int nQueryedKunde;
        int selectedKunde = -1;
        public frm_Kundenformular(int nQueryedKunde)
        {
            InitializeComponent();
            tabKundenverwaltung.SelectedIndex = 1;    
            if (nQueryedKunde == 0)
            {
                nQueryedKunde = -1;
            }
            else if (nQueryedKunde != -1)
            {
                selectedKunde = nQueryedKunde;
                tabKundenverwaltung.SelectedIndex = 1;
            }


        }
        bool bNeuerKunde = false;
        /// <summary>
        /// Beim ersten Aufrufen des Formulares werden in der methode tabKundenverwaltung_Enter
        /// der bindingsourceKunde die Daten source zugewiesen dabei wird die entitäten des DB modelles verwendet
        /// </summary>
        private void tabKundenverwaltung_Enter(object sender, EventArgs e)
        {
            try
            {
                if (nQueryedKunde == 0)
                {
                    if (selectedKunde != -1)
                    {
                        nQueryedKunde = selectedKunde;
                        using (var context = new project_entities())
                        {
                            bindingSourceKunde.DataSource = (from k in context.Kunden
                                                             where k.ID_Kunde == nQueryedKunde
                                                             select k).ToList<Kunde>();
                        }
                    }
                    else
                    {
                        nQueryedKunde = -1;
                    }
                }

                if (nQueryedKunde == -1)
                {
                    bindingSourceKunde.DataSource = aDbconKlasse.get_Kunde_as_List();
                }
            }
            catch (Exception ex)
            {
                aNachrichtenKlasse.ErrorMessage(ex);
            }
        }
        /// <summary>
        /// Wird ein neuer Kunde angelegt oder ein bestehender Kunde verändert wird das mit einen click auf den 
        /// speicherbutton in die DB geschrieben. Dabei wird underschieden zwischen anlegen eines neuen Kunden 
        /// und das ändern eins bestehnenden Kunden
        /// </summary>
        private void speichernToolStripButton_Click(object sender, EventArgs e)
        {
            using (var context = new project_entities())
            {
                try
                {
                        //soll ein neuer Kunde angelegt werden 
                        if (bNeuerKunde)
                        {
                            bindingSourceKunde.EndEdit();

                            Kunde akt_Kunde = new Kunde();
                            akt_Kunde = (Kunde)bindingSourceKunde.Current;

                            write_Anrede_to_DB(akt_Kunde);
                            write_Kundenart_to_DB(akt_Kunde);
                            write_BevorzugtenTechniker_to_DB(akt_Kunde);
                            string s_Rechnungs_Adresse = txt_Rechnungs_Adresse.Text;
                            string s_Rechnungs_PLZ = txt_Rechnungs_PLZ.Text;
                            string s_Rechnungs_Ort = txt_Rechnungs_Ort.Text;

                            remove_null();
                            if (ValidateChildren(ValidationConstraints.Enabled))
                            {
                                string sBemerkungValue = rtb_Bemerkungen.Text;
                                lbl_Bemerkungen.Text = sBemerkung;
                                if (akt_Kunde.Festnetz == null )  
                                {
                                    akt_Kunde.Festnetz = "--";
                                }
                                if (akt_Kunde.Mobil == null )
                                {
                                    akt_Kunde.Mobil = "--";
                                }
                                context.Kunden.Add(akt_Kunde);
                                context.SaveChanges();

                                Kunde new_Kunde = (Kunde)bindingSourceKunde.Current;

                                aDbconKlasse.save_bemerkung(sBemerkungValue, new_Kunde);
                                context.sp_insert_Rechnungs_Adresse(new_Kunde.ID_Kunde, s_Rechnungs_Adresse, s_Rechnungs_PLZ, s_Rechnungs_Ort);
                                bNeuerKunde = false;
                                aNachrichtenKlasse.InfoMessage("Neuer Kunde Erfolgreich angelegt");
                                bindingNavigatorAddNewItem.Enabled = true;
                            }
                        }
                        else
                        {
                            //soll ein bestehender Kunde verändert werden
                            bindingSourceKunde.EndEdit();
                            Kunde up_akt_Kunde = (Kunde)bindingSourceKunde.Current;

                            write_Anrede_to_DB(up_akt_Kunde);
                            write_Kundenart_to_DB(up_akt_Kunde);
                            write_BevorzugtenTechniker_to_DB(up_akt_Kunde);

                            string s_Rechnungs_Adresse = txt_Rechnungs_Adresse.Text;
                            string s_Rechnungs_PLZ = txt_Rechnungs_PLZ.Text;
                            string s_Rechnungs_Ort = txt_Rechnungs_Ort.Text;

                            if (ValidateChildren(ValidationConstraints.Enabled))
                            {
                                string sBemerkungValue = rtb_Bemerkungen.Text;
                                lbl_Bemerkungen.Text = sBemerkung;

                                if (up_akt_Kunde.Festnetz == null)
                                {
                                    up_akt_Kunde.Festnetz = "--";
                                }
                                if (up_akt_Kunde.Mobil == null)
                                {
                                    up_akt_Kunde.Mobil = "--";
                                }

                                context.Kunden.Add(up_akt_Kunde);
                                DbEntityEntry entry = context.Entry(up_akt_Kunde);
                                entry.State = EntityState.Modified;

                                context.SaveChanges();
                                Kunde akt_Kunde = (Kunde)bindingSourceKunde.Current;
                                context.sp_update_Rechnungs_Adresse(akt_Kunde.ID_Kunde, s_Rechnungs_Adresse, s_Rechnungs_PLZ, s_Rechnungs_Ort);
                                aNachrichtenKlasse.InfoMessage("Änderungen wurden übernommen");
                                bindingNavigatorAddNewItem.Enabled = true;

                            }
                        }
                    }
                catch (Exception ex)
                {
                    bindingNavigatorAddNewItem.Enabled = true;
                    aNachrichtenKlasse.ErrorMessage("Kundenformular \n speichernToolStripButton_Click \n\n", ex);
                }
            }
        }
        /// <summary>
        /// Helfermethode welche die Felder mit einen Wert befüllt
        /// da sonst die query nicht fuaNachrichtenKlasseitoniert.
        /// </summary>
        private void remove_null()
        {
            try
            {

                if (txt_Vorname.Text == "")
                {
                    txt_Vorname.Text = "--";
                }
                if (txt_mobil.Text == "")
                {
                    txt_mobil.Text = "--";
                }
                if (txt_festnetz.Text == "")
                {
                    txt_festnetz.Text = "--";
                }
            }
            catch (Exception ex)
            {
                aNachrichtenKlasse.ErrorMessage(ex);
            }


        }
        /// <summary>
        /// hier wird der bevorzugte Techniker aus der drop box in die entsprechende attribut der aktuellen entität eingetragen
        /// in diesen fall akt_kunde.FK_Techniker_bevorzugt
        /// </summary>
        /// <param name="akt_Kunde"></param>
        private void write_BevorzugtenTechniker_to_DB(Kunde akt_Kunde)
        {
            try
            {
                akt_Kunde.FK_Techniker_Bevorzugt = int.Parse(cmb_Techniker.SelectedValue.ToString());
            }
            catch (Exception ex)
            {
                aNachrichtenKlasse.ErrorMessage(ex);
            }

        }
        /// <summary>
        ///hier wird die art des Kunden mittels RadioButtons in die entsprechende attribut der aktuellen entität eingetragen
        /// in diesen fall akt_kunde.Firma
        /// dabei wird ein ein boolscher wert in die DB eingetragen
        /// Frima = 1
        /// Kunde = 0
        /// Privat Kunde = null
        /// </summary>
        /// <param name="akt_Kunde"></param>
        private void write_Kundenart_to_DB(Kunde akt_Kunde)
        {
            //kunde frima privatkunde

            try
            {
                if (rdb_Kunde.Checked)
                {
                    akt_Kunde.Firma = false;
                }
                else if (rdb_Firma.Checked)
                {
                    akt_Kunde.Firma = true;
                }
                else if (rdb_Privat_Kunde.Checked)
                {
                    akt_Kunde.Firma = null;
                }
            }
            catch (Exception ex)
            {
                aNachrichtenKlasse.ErrorMessage(ex);
            }
        }
        /// <summary>
        /// hier wird mittels Radiobutton die Anrede des Kunden bestimmt
        /// Herr = 1
        /// Frau = 0
        /// </summary>
        /// <param name="akt_Kunde"></param>
        private void write_Anrede_to_DB(Kunde akt_Kunde)
        {
            try
            {
                if (rdb_Herr.Checked)
                {
                    akt_Kunde.Anrede = true;
                }
                else if (rdb_Frau.Checked)
                {
                    akt_Kunde.Anrede = false;
                }
                //akt_Kunde.Anrede = rdb_Herr.Checked ? true : false;
            }
            catch (Exception ex)
            {
                aNachrichtenKlasse.ErrorMessage(ex);
            }
        }
        /// <summary>
        /// die variable neuer kunde wird auf true gesetzt damit diese in der methode
        /// "speichernToolStripButton_Click die richtige if-zweig abarbeitet und ein neuer kunde angelegt werden kann
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void bindingNavigatorAddNewItem_Click(object sender, EventArgs e)
        {
            try
            {
                bNeuerKunde = true;
                using (var context = new project_entities())
                {
                    cmb_Techniker.DataSource = context.Techniker.ToList();
                    cmb_Techniker.ValueMember = "ID_Techniker";
                    cmb_Techniker.DisplayMember = "Vorname";
                    tsb_Abbrechen.Visible = true;
                    bindingNavigatorAddNewItem.Enabled = false;
                    bindingNavigatorMoveFirstItem.Enabled = false;
                    bindingNavigatorMovePreviousItem.Enabled = false;
                    bindingNavigatorPositionItem.ReadOnly = true;
                }
            }
            catch (Exception ex)
            {
                aNachrichtenKlasse.ErrorMessage(ex);
            }
        }
        /// <summary>
        /// diese mthode wird aufgerufen sobald man mittels der navigation des Bindingnavigators durch die 
        /// einzelnen Kunden naviegiert
        /// dabei werden die drei methoden für anrede, um was für einen kunden es sich handelt, bevorzugte techniker aufgerufen
        /// sowie die methode zum anzeigen der rechnungs adresse.
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void bindingSourceKunde_CurrentChanged(object sender, EventArgs e)
        {
            try
            {
                if (!Convert.ToString(sender.GetType()).Contains("BindingNavigator"))
                {
                    Kunde akt_Kunde = getAktKunde();
                    if (lbl_Bemerkungen.Text.EndsWith("*"))
                    {
                        DialogResult diaresult = aNachrichtenKlasse.Warnmessage("Es gibt noch ungespeicherte Inhalte.\nWenn Sie die Änderungern verwerfen wollen, klicken Sie OK");
                        if (diaresult == DialogResult.OK)
                        {
                            fillcmb_Techniker(akt_Kunde);
                            selectAnrede(akt_Kunde);
                            selectKundenArt(akt_Kunde);
                            displayRechnungsAdresse(akt_Kunde);
                            checkWartungsvertrag(akt_Kunde);
                            checkletzteWartung(akt_Kunde);
                            getGeräteToKunden(akt_Kunde);
                            
                            DateTime dt = aHelferKlasse.letzteWartung(akt_Kunde.ID_Kunde);
                            
                            if (dt != DateTime.Parse("01.01.1000"))
                            {
                                dtp_letzte_wartung.Value = dt;
                            }
                            else
                            {
                                dtp_letzte_wartung.Value = DateTime.Now;
                            }
                            
                            rtb_Bemerkungen.Text = aDbconKlasse.get_bemerkung(akt_Kunde);
                            lbl_Bemerkungen.Text = sBemerkung;
                            btn_bemerkug_speichern.Visible = false;

                        }
                        else if (diaresult == DialogResult.Cancel)
                        {
                        }
                    }
                    else
                    {
                        fillcmb_Techniker(akt_Kunde);
                        selectAnrede(akt_Kunde);
                        selectKundenArt(akt_Kunde);
                        displayRechnungsAdresse(akt_Kunde);
                        checkWartungsvertrag(akt_Kunde);
                        checkletzteWartung(akt_Kunde);
                        getGeräteToKunden(akt_Kunde);

                        DateTime dt = aHelferKlasse.letzteWartung(akt_Kunde.ID_Kunde);
                        
                        if (dt != DateTime.Parse("01.01.1000"))
                        {
                              dtp_letzte_wartung.Value = dt;
                        }
                        else
                        {
                            dtp_letzte_wartung.Value = DateTime.Now;
                        }

                        
                        rtb_Bemerkungen.Text = aDbconKlasse.get_bemerkung(akt_Kunde);
                        lbl_Bemerkungen.Text = sBemerkung;
                        btn_bemerkug_speichern.Visible = false;
                    }
                }
            }
            catch (Exception ex)
            {
                aNachrichtenKlasse.ErrorMessage(ex);
            }
        }
        /// <summary>
        /// befüllt die dgv welche die geräte type und FD# anzeigt
        /// </summary>
        /// <param name="akt_Kunde"></param>
        private void getGeräteToKunden(Kunde akt_Kunde)
        {
            try
            {
                using (var context = new project_entities())
                {
                    var geräte = (from g in context.Geräte
                                  where g.FK_ID_Kunde == akt_Kunde.ID_Kunde
                                  select new
                                  {
                                      Gerätetyp = g.Bezeichnung,
                                      FDNummer = g.FD_NR,
                                      Thermostat = g.Art
                                  }).ToList();
                    if (geräte != null)
                    {
                        
                        dgv_Geräte.DataSource = geräte;
                    }

                }
            }
            catch (Exception ex)
            {

                aNachrichtenKlasse.ErrorMessage(ex);
            }

        }
        /// <summary>
        /// ermittelt den Aktuellen kunden und gibt ein Kunden object zurück
        /// </summary>
        /// <returns></returns>
        private Kunde getAktKunde()
        {
            try
            {
                Kunde k_akt_Kunde = (Kunde)bindingSourceKunde.Current;
                return k_akt_Kunde;
            }
            catch (Exception ex)
            {
                aNachrichtenKlasse.ErrorMessage(ex);
                throw;
            }
        }
        /// <summary>
        /// checked ob es eine Wartung OHNE Vertrag gibt 
        /// </summary>
        /// <param name="akt_Kunde"></param>
        private void checkletzteWartung(Kunde akt_Kunde)
        {
            try
            {
                using (var context = new project_entities())
                {
                    var letzte_Wartung = context.sp_get_letzter_Wartungsvertrag(akt_Kunde.ID_Kunde).ToList();
                    DateTime dtLetzteWartung = DateTime.Parse("01.01.1000");
                    /*int j = 0;
                    for (int i = 0; i < letzte_Wartung.Count; i++)
                    {
                       
                        if (!letzte_Wartung[i].Gelöscht && j == 0)
                        {
                            sLetzteWartung = letzte_Wartung[i].letzte_wartung.ToString();
                            j++;
                        }
                    }*/
                    dtLetzteWartung = aHelferKlasse.letzteWartung(akt_Kunde.ID_Kunde);

                    if (dtLetzteWartung != DateTime.Parse("01.01.1000"))
                    {
                        if (chb_Wartungsvertrag.Checked)
                        {
                            dtp_letzte_wartung.Visible = true;
                            dtp_letzte_wartung.Enabled = false;
                            cbo_letzte_wartung.Checked = true;
                            btn_Speicher_letzte_Wartung.Visible = false;
                        }
                        else
                        {
                            dtp_letzte_wartung.Visible = true;
                            dtp_letzte_wartung.Enabled = true;
                            cbo_letzte_wartung.Checked = true;
                            btn_Speicher_letzte_Wartung.Visible = true;
                        }
                    }
                    else
                    {
                        dtp_letzte_wartung.Visible = false;
                        cbo_letzte_wartung.Checked = false;
                        btn_Speicher_letzte_Wartung.Visible = false;
                    }
                }
            }
            catch (Exception ex)
            {
                aNachrichtenKlasse.ErrorMessage(ex);
            }
        }
        /// <summary>
        /// hier wird festgestellt ob der Kunde einen/mehrere WV's besitzt 
        /// ist das der Fall nimmt die checkbox den zustand checked an und der Button "Details"
        /// letzte Wartungs Datums feld wird enabled
        /// wird enabled
        /// </summary>
        /// <param name="akt_Kunde"></param>
        private void checkWartungsvertrag(Kunde akt_Kunde)
        {
            try
            {
                using (var context = new project_entities())
                {
                    var WV = context.sp_check_for_WV(akt_Kunde.ID_Kunde).ToList();
                    if (WV.Count != 0)
                    {
                        chb_Wartungsvertrag.Checked = true;
                        btn_Wartungsvertrag_Details.Enabled = true;
                    }
                    else
                    {
                        chb_Wartungsvertrag.Checked = false;
                        btn_Wartungsvertrag_Details.Enabled = false;
                    }
                }
            }
            catch (Exception ex)
            {
                aNachrichtenKlasse.ErrorMessage(ex);
            }
        }
        /// <summary>
        /// aus der DB  werden die Daten zum anzeigen der Rechnungs adresse geladen.
        /// der verwendete value dabei ist die ID des Kunden
        /// </summary>
        /// <param name="akt_Kunde"></param>
        private void displayRechnungsAdresse(Kunde akt_Kunde)
        {
            try
            {
                using (var context = new project_entities())
                {
                    bindingSourceRechnungsAdresse.DataSource = (from ra in context.Rechnungs_Anschriften
                                                                where ra.FK_Kunde == akt_Kunde.ID_Kunde
                                                                select ra).ToList<Rechnungs_Anschrift>();
                }
            }
            catch (Exception ex)
            {
                aNachrichtenKlasse.ErrorMessage(ex);
            }
        }
        /// <summary>
        /// Kundenart wird ausgewählt und in die entität akt_kunde geschrieben
        /// </summary>
        /// <param name="akt_Kunde"></param>
        private void selectKundenArt(Kunde akt_Kunde)
        {
            try
            {
                bool? firma;
                firma = akt_Kunde.Firma;
                if (firma == true)
                {
                    //ddb_Kundenart.SelectedIndex = 2;
                    rdb_Firma.Checked = true;
                }
                else if (firma == false)
                {
                    //ddb_Kundenart.SelectedIndex = 1;
                    rdb_Kunde.Checked = true;
                }
                else if (firma == null)
                {
                    //ddb_Kundenart.SelectedIndex = 3;
                    rdb_Privat_Kunde.Checked = true;
                }
            }
            catch (Exception ex)
            {
                aNachrichtenKlasse.ErrorMessage(ex);
            }

        }
        /// <summary>
        /// in der methode wird die anrede selectiert welche im forumlar dargestellt werden
        /// </summary>
        /// <param name="akt_Kunde"></param>
        private void selectAnrede(Kunde akt_Kunde)
        {
            try
            {
                if (akt_Kunde.Anrede)
                {
                    rdb_Herr.Checked = true;
                }
                else
                {
                    rdb_Frau.Checked = true;
                }
            }
            catch (Exception ex)
            {
                aNachrichtenKlasse.ErrorMessage(ex);
                throw;
            }
        }
        /// <summary>
        /// in der methode wird der bevorzugte techniker ausgewählt und an das steuerelement (dropbox) im formular
        /// übergeben
        /// </summary>
        /// <param name="akt_Kunde"></param>
        private void fillcmb_Techniker(Kunde akt_Kunde)
        {
            try
            {
                using (var context = new project_entities())
                {
                    cmb_Techniker.DataSource = context.Techniker.ToList();
                    cmb_Techniker.ValueMember = "ID_Techniker";
                    cmb_Techniker.DisplayMember = "Vorname";

                    var bevorzugterTechniker = (from t in context.Techniker
                                                where t.ID_Techniker == akt_Kunde.FK_Techniker_Bevorzugt
                                                select t.Vorname).ToList<string>();

                    if (bevorzugterTechniker.Count != 0)
                    {
                        string techniker_Name = bevorzugterTechniker[0].ToString();
                        cmb_Techniker.Text = techniker_Name;
                    }
                }
            }
            catch (Exception ex)
            {
                aNachrichtenKlasse.ErrorMessage(ex);
            }
        }
        /// <summary>
        /// im ersten schritt wird überprüft ob der sender der diese methode auslöst die checkbox für die suche nach rechnungsnummern ist
        /// der checked zustand des elements cb_rechnugns_nummer wird überprüft
        /// wenn eines der textboxen mit text befüllt sind wird wein warnhinweis aufgerufen 
        /// ist das nicht der fall wird die textbox für die rechnungsnummer sofort aktiv geschalten
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void search_form_CheckedChanged(object sender, EventArgs e)
        {
            try
            {
                if (sender == cb_Rechnungs_nummer)
                {
                    if (cb_Rechnungs_nummer.Checked)
                    {
                        if (txt_search_Vorname.Text != "" || txt_search_Nachname.Text != "" || txt_search_PLZ.Text != "" || txt_search_Ort.Text != "" || txt_search_Adresse.Text != "" || txt_search_Tele.Text != "" || txt_search_Festnetz.Text != "")
                        {
                            zeige_Mbox();
                        }
                        else
                        {
                            aktiviere_RechnungsNr_Suche();
                        }
                    }
                    else
                    {
                        txt_search_Rechnung.Enabled = false;
                        txt_search_Rechnung.Text = "";
                        txt_search_Vorname.Enabled = true;
                        txt_search_Nachname.Enabled = true;
                        txt_search_PLZ.Enabled = true;
                        txt_search_Ort.Enabled = true;
                        txt_search_Adresse.Enabled = true;
                        txt_search_Tele.Enabled = true;
                        txt_search_Festnetz.Enabled = true;
                    }
                }
            }
            catch (Exception ex)
            {
                aNachrichtenKlasse.ErrorMessage(ex);
            }
        }
        /// <summary>
        /// die methode wird aufgerugen wenn der check zustand der cb_rechnungs_nummer true ist und in einen der anderen txtboxen ein wert steht.
        /// die textbox wird als warnung mit einem OK und Cancel Button aufgerufen.
        /// wird der OK butten geclickt wird der eine methode aufgerufen 
        /// wird der cancel button geclickt wird die ganze aktion abgebrochen und alles ist so wie vorher.
        /// </summary>
        private void zeige_Mbox()
        {
            try
            {
                DialogResult diaResult = aNachrichtenKlasse.Warnmessage("Alle vorasugefüllten Textfelder werden geleert. Wollen Sie das wirklich?");

                if (diaResult == DialogResult.OK)
                {
                    aktiviere_RechnungsNr_Suche();
                }
                else if (diaResult == DialogResult.Cancel)
                {
                    cb_Rechnungs_nummer.Checked = false;
                }
            }
            catch (Exception ex)
            {
                aNachrichtenKlasse.ErrorMessage(ex);


            }
        }
        /// <summary>
        /// wird beim warnhinweis der mbox ok geclickt oder aber waren alle textboxen leer 
        /// wird diese methode aufgerufen. 
        /// dabei werden alle textboxen geleert und inaktiv geschalten. 
        /// textbox rechnungsnummer wird aktiviert
        /// </summary>
        private void aktiviere_RechnungsNr_Suche()
        {
            try
            {
                txt_search_Rechnung.Enabled = true;
                txt_search_Vorname.Text = "";
                txt_search_Nachname.Text = "";
                txt_search_PLZ.Text = "";
                txt_search_Ort.Text = "";
                txt_search_Adresse.Text = "";
                txt_search_Tele.Text = "";
                txt_search_Festnetz.Text = "";

                txt_search_Vorname.Enabled = false;
                txt_search_Nachname.Enabled = false;
                txt_search_PLZ.Enabled = false;
                txt_search_Ort.Enabled = false;
                txt_search_Adresse.Enabled = false;
                txt_search_Tele.Enabled = false;
                txt_search_Festnetz.Enabled = false;
            }
            catch (Exception ex)
            {
                aNachrichtenKlasse.ErrorMessage(ex);
            }
        }
        /// <summary>
        /// wird nach dem click auf den Button Suchen ausgelöst
        /// hilfvariablen werden angelegt 
        /// hilfsvariablen bekommen den wert übergeben der in der textbox steht, hat diese keinen wert 
        /// wird der wert der variable auf null gesetzt.
        /// mit den hilfvariablen wird die stored procedure aufgerufen
        /// die werte die zurück kommen werden in der Datagridview dargestellt.
        /// 
        /// Hat der User die option gewählt nach rechnungsnummern zu suchen 
        /// wird diese direkt an die stored procedure übergeben. 
        /// und das ergebnis wird in der Datagridview dargestellt.
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void btn_suchen_Click(object sender, EventArgs e)
        {
            try
            {
                using (var context = new project_entities())
                {

                    if (!cb_Rechnungs_nummer.Checked)
                    {
                        string vorname, nachname, PLZ, ort, adresse, mobil, festnetz;
                        #region query_parameter
                        #region vorname
                        if (txt_search_Vorname.Text != "")
                        {
                            vorname = txt_search_Vorname.Text;
                        }
                        else
                        {
                            vorname = null;
                        }
                        #endregion
                        #region nachname
                        if (txt_search_Nachname.Text != "")
                        {
                            nachname = txt_search_Nachname.Text;
                        }
                        else
                        {
                            nachname = null;
                        }
                        #endregion
                        #region PLZ
                        if (txt_search_PLZ.Text != "")
                        {
                            PLZ = txt_search_PLZ.Text;
                        }
                        else
                        {
                            PLZ = null;
                        }
                        #endregion
                        #region Ort
                        if (txt_search_Ort.Text != "")
                        {
                            ort = txt_search_Ort.Text;
                        }
                        else
                        {
                            ort = null;
                        }
                        #endregion
                        #region Adresse
                        if (txt_search_Adresse.Text != "")
                        {
                            adresse = txt_search_Adresse.Text;
                        }
                        else
                        {
                            adresse = null;
                        }
                        #endregion
                        #region Mobil
                        if (txt_search_Tele.Text != "")
                        {
                            mobil = txt_search_Tele.Text;
                        }
                        else
                        {
                            mobil = null;
                        }
                        #endregion
                        #region Festnetz
                        if (txt_search_Festnetz.Text != "")
                        {
                            festnetz = txt_search_Festnetz.Text;
                        }
                        else
                        {
                            festnetz = null;
                        }
                        #endregion
                        #endregion
                        int? id_kunde = null;

                        var search_result = context.sp_search_Kunde(vorname, nachname, PLZ, ort, adresse, mobil, festnetz, id_kunde).ToList();
                        dgv_search_result.DataSource = search_result;
                        btn_serach_Refresh.Visible = true;
                    }
                    else
                    {
                        var q_rechnung = context.sp_search_Rechnungs_Nummer(int.Parse(txt_search_Rechnung.Text)).ToList();
                        dgv_search_result.DataSource = q_rechnung;
                        btn_serach_Refresh.Visible = true;
                    }
                }
            }
            catch (Exception ex)
            {
                aNachrichtenKlasse.ErrorMessage(ex);
            }
        }
        /// <summary>
        /// Behandelt den double click auf das Suchergebnis in der DataGridView 
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void dgv_search_result_DoubleClick(object sender, EventArgs e)
        {
            try
            {
                int cur_index = dgv_search_result.CurrentRow.Index;

                nQueryedKunde = int.Parse(dgv_search_result.Rows[dgv_search_result.CurrentRow.Index].Cells["ID_Kunde"].Value.ToString());
                tabKundenverwaltung.SelectedIndex = 1;
            }
            catch (Exception ex)
            {
                aNachrichtenKlasse.ErrorMessage(ex);
            }

        }
        /// <summary>
        /// Beim wechseln der Tabs werden durch diese Methode die daten neu geladen
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void tabKundenverwaltung_Selected(object sender, TabControlEventArgs e)
        {
            try
            {
                if (nQueryedKunde != -1)
                {
                    if (selectedKunde != -1)
                    {
                        nQueryedKunde = selectedKunde;
                    }
                    using (var context = new project_entities())
                    {
                        bindingSourceKunde.DataSource = (from k in context.Kunden
                                                         where k.ID_Kunde == nQueryedKunde
                                                         select k).ToList<Kunde>();
                    }
                    nQueryedKunde = -1;
                }
                else
                {
                    using (var context = new project_entities())
                    {
                        bindingSourceKunde.DataSource = (from k in context.Kunden
                                                         select k).ToList<Kunde>();
                    }
                }
            }
            catch (Exception ex)
            {
                aNachrichtenKlasse.ErrorMessage(ex);

            }
        }
        /// <summary>
        /// refreshed die such ansicht
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void btn_serach_Refresh_Click(object sender, EventArgs e)
        {
            try
            {
                DialogResult aDialogResult = aNachrichtenKlasse.Warnmessage("Soll das Ergebnis wirklich zurückgesetzt werde?");

                if (aDialogResult == DialogResult.OK)
                {
                    txt_search_Vorname.Text = "";
                    txt_search_Nachname.Text = "";
                    txt_search_PLZ.Text = "";
                    txt_search_Ort.Text = "";
                    txt_search_Adresse.Text = "";
                    txt_search_Tele.Text = "";
                    txt_search_Festnetz.Text = "";
                    dgv_search_result.DataSource = null;
                    btn_serach_Refresh.Visible = false;
                }

            }
            catch (Exception ex)
            {
                aNachrichtenKlasse.ErrorMessage(ex);
            }
        }
        /// <summary>
        /// Validierung für das Kundenformular
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void Validating_Kundenformular(object sender, CancelEventArgs e)
        {
            try
            {
                if (sender == txt_Nachname)
                {
                    erp_Kunde.SetError(txt_Nachname, "");

                    e.Cancel = string.IsNullOrEmpty(txt_Nachname.Text);
                    if (e.Cancel)
                       erp_Kunde.SetError(txt_Nachname, "Der Kunde braucht einen Nachnamen");
                    else
                        erp_Kunde.SetError(txt_Nachname, "");
                }
                if (sender == txt_Adresse)
                {
                    erp_Kunde.SetError(txt_Adresse, "");

                    e.Cancel = string.IsNullOrEmpty(txt_Adresse.Text);
                    if (e.Cancel)
                        erp_Kunde.SetError(txt_Adresse, "Der Kunde braucht einen Adresse");
                    else
                        erp_Kunde.SetError(txt_Adresse, "");
                }
                if (sender == txt_PLZ)
                {
                    erp_Kunde.SetError(txt_PLZ, "");

                    int i = 0;
                    e.Cancel = !int.TryParse(txt_PLZ.Text, out i);
                    if (e.Cancel)
                        erp_Kunde.SetError(txt_PLZ, "Die Adresse des Kunden braucht einen PLZ, \ndiese ist vierstellig und beinhaltet nur Zahen (z.B.: 1010)");
                    else
                        erp_Kunde.SetError(txt_PLZ, "");
                }
                if (sender == txt_ort)
                {
                    erp_Kunde.SetError(txt_ort, "");

                    e.Cancel = string.IsNullOrEmpty(txt_ort.Text);
                    if (e.Cancel)
                        erp_Kunde.SetError(txt_ort, "Der Kunde braucht einen Ort");
                    else
                        erp_Kunde.SetError(txt_ort, "");
                }
            }
            catch (Exception ex)
            {
                aNachrichtenKlasse.ErrorMessage(ex);
                throw;
            }
        }
        /// <summary>
        /// Öffnet das Wartungsformular mit den Aktuellen kunden und zeigt alle Wartungsverträge eines Kunden an
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void btn_Wartungsvertrag_Details_Click(object sender, EventArgs e)
        {
            try
            {
                Kunde _akt_Kunde = new Kunde();
                _akt_Kunde = (Kunde)bindingSourceKunde.Current;

                int akt_Kunde = _akt_Kunde.ID_Kunde;
                Wartungsvertragformular frm_WV_Formular = new Wartungsvertragformular(akt_Kunde);
                frm_WV_Formular.Show();
            }
            catch (Exception ex)
            {
                aNachrichtenKlasse.ErrorMessage(ex);
            }
        }
        /// <summary>
        /// Enabled oder disabled den Butten um Wartungsverträge anzulegen
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void chb_Wartungsvertrag_CheckedChanged(object sender, EventArgs e)
        {
            try
            {
                if (chb_Wartungsvertrag.Checked)
                {
                    btn_Wartungsvertrag_Details.Enabled = true;
                }
                else
                {
                    btn_Wartungsvertrag_Details.Enabled = false;
                }
            }
            catch (Exception ex)
            {
                aNachrichtenKlasse.ErrorMessage(ex);
            }

        }
        /// <summary>
        /// Aktiviert das letzte wartungs DateTime feld und den Speicher button
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void cbo_letzte_wartung_CheckedChanged(object sender, EventArgs e)
        {
            try
            {
                if (cbo_letzte_wartung.Checked)
                {
                    if (chb_Wartungsvertrag.Checked)
                    {
                        dtp_letzte_wartung.Visible = true;
                        dtp_letzte_wartung.Enabled = false;
                        btn_Speicher_letzte_Wartung.Visible = false;
                    }
                    else
                    {
                        dtp_letzte_wartung.Visible = true;
                        dtp_letzte_wartung.Enabled = true;
                        dtp_letzte_wartung.Value = DateTime.Now;
                        btn_Speicher_letzte_Wartung.Visible = true;
                    }
                }
                else
                {
                    dtp_letzte_wartung.Visible = false;
                    btn_Speicher_letzte_Wartung.Visible = false;
                }
            }
            catch (Exception ex)
            {
                aNachrichtenKlasse.ErrorMessage(ex);
            }
        }
        /// <summary>
        /// hier werden die letzte wartung gespeicher (in die DatenbaaNachrichtenKlasse geschrieben)
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void btn_Speicher_letzte_Wartung_Click(object sender, EventArgs e)
        {
            try
            {
                using (var context = new project_entities())
                {
                    try
                    {
                        DateTime dt_letzte_Wartung = dtp_letzte_wartung.Value;
                        int akt_Kunde = getAktKunde().ID_Kunde;
                        context.sp_insert_letzte_Wartung(dt_letzte_Wartung, akt_Kunde);
                        aNachrichtenKlasse.InfoMessage("Letzte Wartung wurde übernommen");
                    }
                    catch (Exception ex)
                    {
                        aNachrichtenKlasse.ErrorMessage(ex);
                    }
                }
            }
            catch (Exception ex)
            {
                aNachrichtenKlasse.ErrorMessage(ex);
            }
        }
        /// <summary>
        /// wird das Focus leave event aus der rtb Bemerkung aufgerufen wird der DB aufruf abgewickelt
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void rtb_Bemerkungen_Leave(object sender, EventArgs e)
        {
            try
            {
                if (lbl_Bemerkungen.Text.EndsWith("*"))
                {
                    string bemerkung = rtb_Bemerkungen.Text;
                    aDbconKlasse.save_bemerkung(bemerkung, getAktKunde());
                    lbl_Bemerkungen.Text = sBemerkung;
                }
            }
            catch (Exception ex)
            {
                aNachrichtenKlasse.ErrorMessage("Kundenformular.cs /n rtb_Bemerkung_Leave /n/n", ex);
            }
        }
        /// <summary>
        /// wird der Text im Bemerkungsfeld geändert wird die möglicaHelferKlasseeit zum speichern freigeschalten 
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void rtb_Bemerkungen_TextChanged(object sender, EventArgs e)
        {
            if (!lbl_Bemerkungen.Text.EndsWith("*"))
            {
                if (rtb_Bemerkungen.Text != "")
                {
                    lbl_Bemerkungen.Text = lbl_Bemerkungen.Text + "*";
                    btn_bemerkug_speichern.Visible = true;
                }
            }
        }
        private void tsb_Abbrechen_Click(object sender, EventArgs e)
        {
            try
            {
                DialogResult aDialogResult = aNachrichtenKlasse.Warnmessage("Sind Sie sicher das die änderungen verworfen werden sollen?");
                if (aDialogResult == DialogResult.OK)
                {
                    if (nQueryedKunde == -1)
                    {
                        bindingSourceKunde.DataSource = aDbconKlasse.get_Kunde_as_List();
                    }
                    tsb_Abbrechen.Visible = false;

                    bindingNavigatorAddNewItem.Enabled = true;
                    bindingNavigatorMoveFirstItem.Enabled = true;
                    bindingNavigatorMovePreviousItem.Enabled = true;
                    bindingNavigatorPositionItem.ReadOnly = false;
                    bNeuerKunde = false;
                }
            }
            catch (Exception ex)
            {
                aNachrichtenKlasse.ErrorMessage(ex);
            }
        }
        /// <summary>
        /// behandelt das Save event des speicherbuttons bei der geräte dgv
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void btn_NeuesGerät(object sender, EventArgs e)
        {
            Kunde _akt_Kunde = new Kunde();
            _akt_Kunde = (Kunde)bindingSourceKunde.Current;

            int akt_Kunde = _akt_Kunde.ID_Kunde;
            neuesGerät frm_Neues_Gerät = new neuesGerät(akt_Kunde);
            frm_Neues_Gerät.Show();
        }
        /// <summary>
        /// aktualisiert die dgv welche die Geräte information anzeigt
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void btn_Aktualisieren_Geräte_DGV_Click(object sender, EventArgs e)
        {
            Kunde akt_Kunde = getAktKunde();
            getGeräteToKunden(akt_Kunde);
        }
    }
}
